/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package modulo;

import Eventos.CustomEvent;
import Manager.BDManager;
import Modulos.ListadoControlador;
import Modulos.ListadoVista;
import Modulos.Modulo;
import Modulos.ModuloSplit;
import entidates.IEntidad;
import entidates.Persona;
import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import manejadores.ManejadorPersona;
import utility.Globals;

/**
 *
 * @author Overpower
 */

public class ModuloPersona extends Modulo{

    private Modulos.ModuloSplit _vista;
    private FichaPersonalControlador _controladorFicha;
    private ListadoControlador _controladorListado;
    private Persona _personaSeleccionada;
    private int _seleccionActual;
       
    public ModuloPersona()
    {
        initComponents();
    }
    
    @Override
    protected final void initComponents() {
        
        BDManager.Get().Setup(Globals.DataBaseURL, Globals.DataBaseName);
        
        String _err = BDManager.Get().Connectar(Globals.AdminName, Globals.AdminPass);
        if( !"".equals(_err) )
        {
            JOptionPane.showMessageDialog(_vista, _err, "Error", 1 );
        }else{
            JOptionPane.showMessageDialog(_vista, "se conecto", "Success", 1 );
        }
        
        _manejador = new ManejadorPersona( );
        
        _tipo = ETipoModulo.MOD_PERSONA;
        _nombre = "ModuloPersona";
        
        _vista = new ModuloSplit();
        
        _controladorFicha = new FichaPersonalControlador();
        _controladorFicha.SetModulo(this);
        
        _controladorListado = new ListadoControlador();
        _controladorListado.SetModulo(this);
        _controladorListado.SetModel( CreateModel() );
        ActualizarLista(_manejador.GetList());
        _controladorListado.SetListaBuscar (new String[]{"Nombre","Apellido","DNI","Legajo","Direccion","Ciudad","Provincia"});
        _controladorListado.SetListaOrdenar(new String[]{"Nombre","Apellido","DNI","Legajo"});
        
        javax.swing.JPanel _panel = _vista.getPanelIzquierdo();
        _panel.setLayout(new java.awt.BorderLayout());
        _panel.add( (Component)_controladorListado.getVista());
        Dimension _size = _panel.getMinimumSize();
        Dimension _sizePrefered = ((ListadoVista)_controladorListado.getVista()).getPanel().getPreferredSize();
        _size.width = _sizePrefered.width + 20;
        _size.height = _sizePrefered.height + 20;
        
        _panel.setSize(_size);
        _panel.setMinimumSize(_size);
                
        _panel = _vista.getPanelDerecho();
        _panel.setLayout(new java.awt.BorderLayout());
        
        javax.swing.JScrollPane _scroll = new javax.swing.JScrollPane((Component)_controladorFicha.getVista());
        _panel.add( _scroll );
        
        // registro listeners
        _controladorFicha.AddCustomListener(this::CustomEventListener);
        _controladorListado.AddCustomListener(this::BuscarOrdenarEventListener);
        

    }
    
    private void CustomEventListener( CustomEvent evt )
    {
        String _identificador = evt.GetId();
        if( "OnEdition".equals(_identificador) )
        {
            //_controladorListado.Habilitado( "end".equals(evt.GetData()) );
            if( "begin".equals((String)evt.GetData()) )
            {
                _controladorListado.BotonesHabilitados(false);
            }else{
                _controladorListado.BotonesHabilitados(true);
            }
        }
    }
    
    private void BuscarOrdenarEventListener( CustomEvent evt )
    {
        String _eventName = evt.GetId();
        if( "OnSearch".equals( _eventName ) )
        {
            ListadoControlador.SearchData _data = (ListadoControlador.SearchData)evt.GetData();
            
            String _err = _manejador.Buscar(_data.filter, _data.text, _data.range, null, null);
            
            if( "".equals(_err) )
                ActualizarLista( _manejador.GetList() );
        }else if("OnOrderBy".equals(_eventName) ){  
            OrderBy((String)evt.GetData());  
        }
    }
    
    public void ActualizarLista( ArrayList<IEntidad> _lista )
    {
        String _registros[][] = null;
        if(null != _lista){
            int _count = _lista.size();
            _registros = new String[_count][];

            for( int i = 0; i < _count; i++ )
            {
                Persona _p = (Persona)_lista.get(i);
                _registros[i] = new String[4];
                _registros[i][0] = _p.GetNombre();
                _registros[i][1] = _p.GetApellido();
                _registros[i][2] = _p.GetDocumento().toString();
                _registros[i][3] = _p.GetLegajo().toString();
            }
        }
        
        _controladorListado.SetModelData(_registros);
    }
    
    private DefaultTableModel CreateModel()
    {
        String titulo[] = 
        {
            "Nombre",
            "Apellido",
            "DNI",
            "Legajo"
        };
        
        return new DefaultTableModel(null, titulo){
            @Override
            public boolean isCellEditable(int row,int column){
                return false;  
            }   
        };
    }
    
    @Override
    public String Modificar(IEntidad _ent) {
        String _err = "";
        _err += _manejador.Modificar(_ent);
        
        if( "".equals(_err) )
        {
            Persona _p = (Persona)_ent;
            String _row[] = 
            {
                _p.GetNombre(),
                _p.GetApellido(),
                _p.GetDocumento().toString(),
                _p.GetLegajo().toString()
            };
            
            _controladorListado.Modificar(_row);
            _controladorListado.BotonesHabilitados(true);
        }
        
        return _err;
    }
    
    @Override
    public String Agregar(IEntidad _ent) {
        String _err = "";
        _err += _manejador.Agregar(_ent);
        if( "".equals(_err) )
        {
            Persona _p = (Persona)_ent;
            String _row[] = 
            {
                _p.GetNombre(),
                _p.GetApellido(),
                _p.GetDocumento().toString(),
                _p.GetLegajo().toString()
            };
            
            _controladorListado.Agregar(_row);
            _controladorListado.BotonesHabilitados(true);
        }
        return _err;
    }

    @Override
    public String Eliminar(IEntidad _ent) {
        
        String _err = _manejador.Eliminar(_personaSeleccionada);
        
        if( "".equals(_err) )
        {
           _controladorListado.Eliminar(_seleccionActual); 
           _personaSeleccionada = null;
           _seleccionActual = -1;
        }
        
        return _err;
    }
    
    @Override
    public void Alta() {
       _controladorListado.BotonesHabilitados(false);
       _controladorFicha.LimpiarDatos();
       _controladorFicha.ModoAlta();
    }

    @Override
    public void Baja() {
        if( null == _personaSeleccionada )
            return;
        String _err = Eliminar( _personaSeleccionada );
        
        if( "".equals(_err) )
        {
            _controladorListado.BotonesHabilitados(false);
            _controladorFicha.LimpiarDatos();
            _controladorFicha.Editable(false);
        }
    }
    
    @Override
    public void Seleccion( int _idx )
    {
       _controladorListado.BotonesHabilitados(true);
       _seleccionActual = _idx;
       _personaSeleccionada = (Persona)_manejador.Obtener(_idx);
       _controladorFicha.PoblarDatos(_personaSeleccionada);
       _controladorFicha.Editable(true);
    }

    @Override
    public Component getVista() {
        return _vista;
    }
    
    void OrderBy(String _ordering )
    {
        ArrayList<IEntidad> _list = _manejador.GetList();
        int _size = _list.size();
        for( int i = 0; i < _size-1; i++  )
        {
            for( int j = i + 1; j < _size; j++ )
            {
                //Persona _
                Boolean _condition = false;
                switch(_ordering)
                {
                    case "Nombre":
                        //_condition = 
                        break;
                }
                
            }
        }
    }
}
